<?php
namespace library;

use idea\ap\ErrorException;
use helper\Log;

/**
 * AjaxAction abstract class file
 * AjaxAction基类，用于Ajax方式输出数据
 * @author 宋欢 <iphper@yeah.net>
 * @version $Id: AjaxAction.php 1 2013-04-05 01:08:06Z huan.song $
 * @package library
 * @since 1.0
 */
abstract class AjaxAction extends BaseAction
{
	/**
	 * @var integer 错误码
	 */
	protected $_errNo = 0;
	
	/**
	 * @var string 错误信息
	 */
	protected $_errMsg = '';
	
	/**
	 * Json方式输出数据，如果项目不是Utf-8编码，需要重写此方法，转换编码格式
	 * @param mixed $ret
	 * @return void
	 */
	public function display($ret)
	{
		$data = $this->getViewData($ret);
		echo json_encode($data);
	}
	
	/**
	 * 获取Ajax方式输出数据，规范化输出数据的格式
	 * 必须是数组格式，并且包含下面的内容：err_no (integer)、err_msg (string)、data (array)
	 * 默认添加的输出内容：log_id (integer)
	 * @param mixed $data
	 * @return array
	 * @throws ErrorException 如果输出数据时数组，但是不包含err_no、err_msg、data或者data不是数组，抛出异常
	 */
	public function getViewData($data)
	{
		if (is_array($data)) {
			if (isset($data['err_no'])) {
				$this->_errNo = (int) $data['err_no'];
				unset($data['err_no']);
			}
			
			if (isset($data['err_msg'])) {
				$this->_errMsg = $data['err_msg'];
				unset($data['err_msg']);
			}
		}
		
		if (isset($data['data'])) {
			$data = (array) $data['data'];
		}
		
		return array(
			'err_no' => $this->_errNo,
			'err_msg' => $this->_errMsg,
			'data' => $data,
			'log_id' => Log::getId()
		);
		
		return $data;
	}
}
